package other.game;

import java.util.Arrays;

public class MyArrayList<T> {
    // 定义数组用来保存元素
    private Object[] elements; // [null,null,null,null,null]
    // 定义size用来记录元素个数
    private int size;

    public MyArrayList() {
        // 初始化数组，默认容量为5
        elements = new Object[5];
        // 初始化大小，默认个数为0
        size = 0;
    }

    public void add(T e) {
        // 判断是否需要扩容
        if (size == elements.length) {
            // 扩容为原数组长度的2倍
            elements = Arrays.copyOf(elements, elements.length * 2);
        }
        // 将添加的元素放到数组中
        elements[size] = e;
        // 改变size的值，以便下次添加元素到下一个位置
        size++;
    }

    public T get(int index) {
        // 判断下标是否超出范围
        if (index < 0 || index >= size) {
            //throw new IndexOutOfBoundsException("Index out of bounds: " + index);
            // 如果下标超出范围，直接返回null
            return null;
        }
        // 获取指定下标的元素强转为T类型并返回
        /*
        Object e = elements[index];
        return (T) e;
         */
        return (T) elements[index];
    }

    public void set(int index, T e) {
        // 判断下标是否超出范围
        if (index < 0 || index >= size) {
            //throw new IndexOutOfBoundsException("Index out of bounds: " + index);
            return;
        }
        // 将指定下标的元素设置为指定的新元素
        elements[index] = e;
    }

    public boolean remove(int index) {
        if (index < 0 || index >= size) {
            return false;
        }
        //   0    1    2    3    4
        // [100, 200, 300, 400, 500]
        // 从删除的位置开始，将后面的每个元素往前移动一个位置
        for (int i = index; i < size - 1; i++) {
            // 将后一个元素移动到前一个位置来
            elements[i] = elements[i + 1];
        }
        // 将最后一个位置设置为null，表示删了一个元素
        elements[size - 1] = null;
        // 记录元素的个数少1个
        size--;
        return true;
    }

    // [1,2,3,4,...]
    public String toString() {
        /*StringBuilder builder = new StringBuilder();
        builder.append("[");
        // 遍历每个元素
        for (int i = 0; i < size; i++) { // [100,200,400,500,null]
            // 获取当前遍历的元素
            Object e = elements[i];
            // 将当前遍历的元素追加到字符串中
            builder.append(e);
            // 如果不是最后一个元素时，在元素的后面追加一个逗号和空格
            if (i != size - 1) {
                builder.append(", ");
            }
        }
        builder.append("]");
        // 将StringBuilder转成String并返回
        return builder.toString();*/
        return Arrays.toString(Arrays.copyOf(elements, size));
    }

}

class MyArrayListTest {
    public static void main(String[] args) {
        MyArrayList1<Integer> list = new MyArrayList1<>();
        System.out.println(list); // []
        list.add(100);
        list.add(200);
        list.add(300);
        System.out.println(list); // [100, 200, 300]
        Integer i = list.get(1);
        System.out.println(i); // 200
        list.set(2, 400);
        System.out.println(list.get(2)); // 400
    }
}
